package model

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
	"encoding/json"
	"go_code/projectExec2/common/message"
)

//我们在服务器启动后，就初始化一个userDao实例，把它做成全局变量，在需要和redis操作时，就可直接调用
var (
	MyUserDao *UserDao
)


//定义一个UserDao结构体
//完成对User结构体的各种操作
type UserDao struct{
	pool *redis.Pool
}
//通过工厂模式，创建一个UserDao实例
func NewUserDao(pool *redis.Pool)(userDao *UserDao){
	userDao = &UserDao{
		pool : pool,
	}
	return 
}

//1、根据一个用户id返回user实例
func (this *UserDao) getUserById(conn redis.Conn,id int)(user *User,err error){
	//通过给定的id去redis查询用户
	res,err := redis.String(conn.Do("HGet","users",id))
	if	err != nil{
		if err == redis.ErrNil{ //ErrNil表示在users哈希中，没有找到对应的id
			err = ERROR_USER_NOTEXISTS
		}
		return
	}
	user = &User{}
	//将res反序列化成User对象
	err = json.Unmarshal([]byte(res),user)
	if err != nil {
		fmt.Println("Json Unmarshal Error: ",err)
	}
	return
}

//2、完成登录校验
//Login 完成对用户的校验，如果密码账号都正确就返回一个user实例
//如果用户id或pwd错误就返回一个error
func (this *UserDao) Login(userId int,userPwd string) (user *User,err error){
	conn := this.pool.Get()
	defer conn.Close()
	user,err = this.getUserById(conn,userId)
	if err != nil{
		return
	}
	//执行到这一步证明用户获取到了，接下来校验密码
	if user.UserPwd != userPwd{
		err = ERROR_USER_PWD
		return
	}
	return
}


//Register
func (this *UserDao) Register(user *message.User) (err error){
	conn := this.pool.Get()
	defer conn.Close()

	_,err = this.getUserById(conn,user.UserId)
	if err == nil{
		err = ERROR_USER_EXISTS
		return
	}

	//没有在redis找到说明可以注册
	data,err := json.Marshal(user)  //将user序列化
	if err != nil{
		fmt.Println("Register server json marshal~err : ",err)
		return
	}
	_,err = conn.Do("HSET","users",user.UserId,string(data))
	if err != nil{
		fmt.Println("保存用户注册错误~err : ",err)
		return
	}
	return
}